package com.mxy.myapplication.activity;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.mxy.myapplication.util.Util;

import java.util.ArrayList;

/**
 * Activity父类
 * @author 马晓勇
 */

public class BaseActivity extends AppCompatActivity {

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Util.immerse(this);
  }

  /**
   * 粘性头列表更新数据的逻辑小例子
   */
  private void stickyHeaderUpdateList() {
    Grade grade1 = new Grade();
    grade1.setGradeName("一年级");

    Class grade1c1 = new Class();
    grade1c1.setClassName("一年级一班");
    grade1.getClasses().add(grade1c1);
    Class grade1c2 = new Class();
    grade1c2.setClassName("一年级二班");
    grade1.getClasses().add(grade1c2);
    Class grade1c3 = new Class();
    grade1c3.setClassName("一年级三班");
    grade1.getClasses().add(grade1c3);


    Grade grade2 = new Grade();
    grade1.setGradeName("二年级");

    Class grade2c1 = new Class();
    grade2c1.setClassName("二年级一班");
    grade2.getClasses().add(grade2c1);
    Class grade2c2 = new Class();
    grade2c2.setClassName("二年级二班");
    grade2.getClasses().add(grade2c2);
    Class grade2c3 = new Class();
    grade2c3.setClassName("二年级三班");
    grade2.getClasses().add(grade2c3);

    //从接口获取的数据
    //不知道目前有多少个类别，也不知道每个类别下有多少个具体数据
    //注意这个列表是年级数据的集合 包含年级下的班级数据集合
    ArrayList<Grade> dataFromInterface = new ArrayList<>();

    //循环年级数据，标注班级数据的首尾行
    for (int i = 0; i < dataFromInterface.size(); i++) {
      dataFromInterface.get(i).getClasses().get(0).isFirst = true;
      dataFromInterface.get(i).getClasses().get(dataFromInterface.get(i).getClasses().size() - 1).isLast = true;
    }

    //当前数据列表
    //不知道目前有多少个类别，也不知道每个类别下有多少个具体数据
    //注意这个列表是班级数据的集合 是最末级数据集合
    ArrayList<Class> dataOfAdapter = new ArrayList<>();

    //开始插入数据
    //注意我们是在不清楚当前数据列表和从接口获取的数据的前提下

    //当前列表无数据!
    if (dataOfAdapter.size() == 0) {
      for (int i = 0; i < dataFromInterface.size(); i++) {
        dataOfAdapter.addAll(dataFromInterface.get(i).getClasses());
      }
      //刷新列表数据
    } else {//当前列表有数据！
      //遍历当前列表中数据
      for (int i = 0; i < dataOfAdapter.size(); i++) {
        //注意我们只判断是最类别后一行的情况，所以效率很高
        //发现是某一个类别的最后一行
        if (dataOfAdapter.get(i).isLast) {
          //然后遍历接口数据集合，因为接口数据是年级集合，所以遍历效率也很高
          for (int j = 0; j < dataFromInterface.size(); j++) {
            //如果发现是相同类别
            if (dataOfAdapter.get(i).getGradeName().equals(dataFromInterface.get(j).getGradeName())) {
              //当前数据列表中已存在像同类别，所以把接口数据中该类别首行标识去掉
              dataFromInterface.get(i).getClasses().get(0).isFirst = false;
              //当前类最后一行易主
              dataOfAdapter.get(i).isLast = false;
              //循环将该类别数据，插入当前数据列表集合中
              for (int k = 0; k < dataFromInterface.get(j).getClasses().size(); k++) {
                //注意,我们是要在类别尾部追加数据，又因为k是从0开始，所以需要i + k + 1
                dataOfAdapter.add(i + k + 1, dataFromInterface.get(j).getClasses().get(k));
              }
              //由于是插入相同的类别数据，所以外层循环的i值需要加上插入的当前类别的数量，避免重复遍历
              i = i + dataFromInterface.get(j).getClasses().size();
              //将已经插入到当前列表的数据，从接口数据集合中移除，避免重复遍历
              dataFromInterface.remove(dataFromInterface.get(j));
              //当前类别插入完毕,退出循环
              break;
            }
          }
        }
      }
      //循环过后，此时从接口获取的数据集合中，已经仅剩下当前列表没有的类别，我们直接把剩余的类别批量插入即可
      for (int i = 0; i < dataFromInterface.size(); i++) {
        dataOfAdapter.addAll(dataFromInterface.get(i).getClasses());
      }
      //刷新列表数据
    }
  }


  /**
   * 年级类
   */
  private class Grade {

    //年级
    private String gradeName;

    private ArrayList<Class> classes = new ArrayList<>(10);

    public String getGradeName() {
      return gradeName;
    }

    public void setGradeName(String gradeName) {
      this.gradeName = gradeName;
    }

    public ArrayList<Class> getClasses() {
      return classes;
    }

    public void setClasses(ArrayList<Class> classes) {
      this.classes = classes;
    }
  }

  /**
   * 班级类
   */
  private class Class {

    //年级
    private String gradeName;
    //班级
    private String className;
    //是否当前年级第一行数据
    private boolean isFirst = false;
    //是否当前年级最后一行数据
    private boolean isLast = false;


    public String getGradeName() {
      return gradeName;
    }

    public void setGradeName(String gradeName) {
      this.gradeName = gradeName;
    }

    public String getClassName() {
      return className;
    }

    public void setClassName(String className) {
      this.className = className;
    }
  }
}